/*
*********************************************************************************************************
*
*                                           ctrl_io.c
*
* 文件名称 : ctrl_io.c
* 文件版本 : V0.01
* 文件描述 : 通用Io设置
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2013.11.29
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                           头文件描述
*********************************************************************************************************
*/
#include "ctrl_io.h"
#include "stdint.h"
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "time.h"
/*
*********************************************************************************************************
*                                           预处理描述
*********************************************************************************************************
*/
//继电器使能计数器
static  uint32_t  relayEnCounter = 0;

/*
*********************************************************************************************************
*
*                                           LED_GPIO初始化
*
* 函数名称 : LED_GPIO_INIT()
* 函数版本 : V0.01
* 功能描述 : 初始化LED控制GPIO
*           : PIN在PA12 高电平灭 低电平量
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2013.11.29
*********************************************************************************************************
*/
void led_io_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF , ENABLE);

  //RUN1
  GPIO_InitStructure.GPIO_Pin    = LED_RUN1_Pin;
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;          //端口模式为输出方式
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;          //推挽方式输出
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_100MHz;      //时钟速度为100M
  GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;           //上拉
  GPIO_Init(LED_RUN1_GPIO, &GPIO_InitStructure);           //以参数初始化PA口

  //RUN2
  GPIO_InitStructure.GPIO_Pin  =   LED_RUN2_Pin;
  GPIO_Init(LED_RUN2_GPIO, &GPIO_InitStructure);
  //SATA1
  GPIO_InitStructure.GPIO_Pin  =   LED_STA1_Pin;
  GPIO_Init(LED_STA1_GPIO, &GPIO_InitStructure);
  //SATA2
  GPIO_InitStructure.GPIO_Pin  =   LED_STA2_Pin;
  GPIO_Init(LED_STA2_GPIO, &GPIO_InitStructure);
  //ABN
  GPIO_InitStructure.GPIO_Pin  =    LED_ABN_Pin;
  GPIO_Init(LED_ABN_GPIO,  &GPIO_InitStructure);
  //WAR
  GPIO_InitStructure.GPIO_Pin  =    LED_WAR_Pin;
  GPIO_Init(LED_WAR_GPIO,  &GPIO_InitStructure);
  //ERR
  GPIO_InitStructure.GPIO_Pin  =    LED_ERR_Pin;
  GPIO_Init(LED_ERR_GPIO,  &GPIO_InitStructure);
}

/*
*********************************************************************************************************
*
*                                          LED控制
*
* 函数名称 : LED_ON() LED_OFF() LED_Toggle()
* 函数版本 : V0.01
* 功能描述 :
*          :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2013.11.30
*********************************************************************************************************
*/
void led_off(uint32_t led)
{
  switch (led) {
  case RUN1:
    GPIO_SetBits(LED_RUN1_GPIO, LED_RUN1_Pin);
    break;
  case RUN2:
    GPIO_SetBits(LED_RUN2_GPIO, LED_RUN2_Pin);
    break;
  case STA1:
    GPIO_SetBits(LED_STA1_GPIO, LED_STA1_Pin);
    break;
  case STA2:
    GPIO_SetBits(LED_STA2_GPIO, LED_STA2_Pin);
    break;
  case ABN:
    GPIO_SetBits(LED_ABN_GPIO,   LED_ABN_Pin);
    break;
  case WAR:
    GPIO_SetBits(LED_WAR_GPIO,   LED_WAR_Pin);
    break;
  case ERR:
    GPIO_SetBits(LED_ERR_GPIO,   LED_ERR_Pin);
    break;
  case LEDALL:
    GPIO_SetBits(LED_RUN1_GPIO, LED_RUN1_Pin);
    GPIO_SetBits(LED_RUN2_GPIO, LED_RUN2_Pin);
    GPIO_SetBits(LED_STA1_GPIO, LED_STA1_Pin);
    GPIO_SetBits(LED_STA2_GPIO, LED_STA2_Pin);
    GPIO_SetBits(LED_ABN_GPIO,   LED_ABN_Pin);
    GPIO_SetBits(LED_WAR_GPIO,   LED_WAR_Pin);
    GPIO_SetBits(LED_ERR_GPIO,   LED_ERR_Pin);
    break;

  default:
    break;
  }
}

void LED_ON(uint32_t led)
{
  switch (led) {
  case RUN1:
    GPIO_ResetBits(LED_RUN1_GPIO, LED_RUN1_Pin);
    break;
  case RUN2:
    GPIO_ResetBits(LED_RUN2_GPIO, LED_RUN2_Pin);
    break;
  case STA1:
    GPIO_ResetBits(LED_STA1_GPIO, LED_STA1_Pin);
    break;
  case STA2:
    GPIO_ResetBits(LED_STA2_GPIO, LED_STA2_Pin);
    break;
  case ABN:
    GPIO_ResetBits(LED_ABN_GPIO,  LED_ABN_Pin);
    break;
  case WAR:
    GPIO_ResetBits(LED_WAR_GPIO,  LED_WAR_Pin);
    break;
  case ERR:
    GPIO_ResetBits(LED_ERR_GPIO,  LED_ERR_Pin);
    break;
  case LEDALL:

    GPIO_ResetBits(LED_RUN1_GPIO, LED_RUN1_Pin);
    GPIO_ResetBits(LED_RUN2_GPIO, LED_RUN2_Pin);
    GPIO_ResetBits(LED_STA1_GPIO, LED_STA1_Pin);
    GPIO_ResetBits(LED_STA2_GPIO, LED_STA2_Pin);
    GPIO_ResetBits(LED_ABN_GPIO,   LED_ABN_Pin);
    GPIO_ResetBits(LED_WAR_GPIO,   LED_WAR_Pin);
    GPIO_ResetBits(LED_ERR_GPIO,   LED_ERR_Pin);
    break;
  default:
    break;
  }
}

void LED_Toggle(uint32_t led)
{
  switch (led) {
    case RUN1:
      GPIO_ToggleBits(LED_RUN1_GPIO, LED_RUN1_Pin);
      break;

    case RUN2:
      GPIO_ToggleBits(LED_RUN2_GPIO, LED_RUN2_Pin);
      break;

    case STA1:
      GPIO_ToggleBits(LED_STA1_GPIO, LED_STA1_Pin);
      break;

    case STA2:
      GPIO_ToggleBits(LED_STA2_GPIO, LED_STA2_Pin);
      break;

    case ABN:
      GPIO_ToggleBits(LED_ABN_GPIO, LED_ABN_Pin);
      break;

    case WAR:
      GPIO_ToggleBits(LED_WAR_GPIO, LED_WAR_Pin);
      break;

    case ERR:
      GPIO_ToggleBits(LED_ERR_GPIO, LED_ERR_Pin);
      break;

    case LEDALL:
      GPIO_ToggleBits(LED_RUN1_GPIO, LED_RUN1_Pin);
      GPIO_ToggleBits(LED_RUN2_GPIO, LED_RUN2_Pin);
      GPIO_ToggleBits(LED_STA1_GPIO, LED_STA1_Pin);
      GPIO_ToggleBits(LED_STA2_GPIO, LED_STA2_Pin);
      GPIO_ToggleBits(LED_ABN_GPIO,   LED_ABN_Pin);
      GPIO_ToggleBits(LED_WAR_GPIO,   LED_WAR_Pin);
      GPIO_ToggleBits(LED_ERR_GPIO,   LED_ERR_Pin);
      break;

    default:
      break;
    }
}

/*
*********************************************************************************************************
*
*                                           DCChannel_GPIO_INIT初始化
*
* 函数名称 : DCChannel_GPIO_INIT()
* 函数版本 : V0.01
* 功能描述 : 初始化DC选通的GPIO
*                               信号: PC2' --- GPIO_PB3
*                                     PC0' --- GPIO_PB4
*                                     PC3' --- GPIO_PB5
*
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.08.25
*            V0.02，时间2015.10.21  FXT  GPIO_PB5
*********************************************************************************************************
*/
void DCChannel_GPIO_INIT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;          //端口模式为输出
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;          //推挽方式输出
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_100MHz;      //时钟速度为100M
  GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;         //
  GPIO_Init(GPIOB, &GPIO_InitStructure);                   //以参数初始化PB口

  //DCChannel_Disable();                                     //禁止DC通道
}

/*
*********************************************************************************************************
*
*                                           DCChannel直流通道选通
*                                           使用时需提前使能通道
* 函数名称 : DCChannel()
* 函数版本 : V0.01
* 功能描述 : dc_channel = 0  DC1  0~20mA模拟量
*                        1  DC2  0~20mA模拟量
*                        2  DC3  PT100
*                        3  DC4  PT100
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.08.25
*           V0.02，时间2015.10.21 FXT
*********************************************************************************************************
*/
void DCChannel(uint8_t dc_channel)
{
  switch(dc_channel)
    {
    case 0:                                  //00
        //GPIO_SetBits(  GPIOB, GPIO_Pin_5); //PC3'
        GPIO_ResetBits(GPIOB, GPIO_Pin_4);   //PC0'
        GPIO_ResetBits(GPIOB, GPIO_Pin_3);   //PC2'
        break;

    case 1:                                  //01
        //GPIO_SetBits(  GPIOB, GPIO_Pin_5); //PC3'
        GPIO_SetBits(  GPIOB, GPIO_Pin_4);   //PC0'
        GPIO_ResetBits(GPIOB, GPIO_Pin_3);   //PC2'
        break;

    case 2:                                  //10
        //GPIO_SetBits(  GPIOB, GPIO_Pin_5); //PC3'
        GPIO_ResetBits(  GPIOB, GPIO_Pin_4); //PC0'
        GPIO_SetBits(GPIOB, GPIO_Pin_3);     //PC2'
        break;

    case 3:                                  //11
        //GPIO_SetBits(  GPIOB, GPIO_Pin_5); //PC3'
        GPIO_SetBits(  GPIOB, GPIO_Pin_4);   //PC0'
        GPIO_SetBits(  GPIOB, GPIO_Pin_3);   //PC2'
        break;
    default:
        break;
    }
}


/*
*********************************************************************************************************
*
*                                           YK_GPIO_INIT初始化
*
* 函数名称 : YK_GPIO_INIT()
* 函数版本 : V0.01
* 功能描述 : 初始化遥控GPIO
*           :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.08.25
*********************************************************************************************************
*/
void YK_GPIO_INIT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|
                         RCC_AHB1Periph_GPIOB|
                         RCC_AHB1Periph_GPIOC|
                         RCC_AHB1Periph_GPIOF|
                         RCC_AHB1Periph_GPIOG|
                         RCC_AHB1Periph_GPIOH|
                         RCC_AHB1Periph_GPIOI,ENABLE);
  //YKEN-,PI2  YKEN+,PI3
  GPIO_InitStructure.GPIO_Pin    = YKCtrl_N_Pin | YKCtrl_P_Pin;
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;          //端口模式为输出方式
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;          //推挽方式输出
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_100MHz;      //时钟速度为100M
  GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;           //上拉
  GPIO_Init(GPIOI, &GPIO_InitStructure);

  //关闭遥控使能
  YK_EN_OFF();
  //cpuDelayMs(3);

  //YK18,PA8  YK4,PA11  YK1,PA12,                                     3
  GPIO_InitStructure.GPIO_Pin    = YK18_Pin|YK4_Pin|YK1_Pin;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //YK13,PB1  YK7,PB14  YK20,PB15,                                    3
  GPIO_InitStructure.GPIO_Pin    = YK13_Pin|YK7_Pin|YK20_Pin;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //YK15,PC4  YK24,PC5  YK6,PC8  YK3,PC9,                             4
  GPIO_InitStructure.GPIO_Pin    = YK15_Pin|YK24_Pin|YK6_Pin|YK3_Pin;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  //YK23,PF11,                                                        1
  GPIO_InitStructure.GPIO_Pin    = YK23_Pin;
  GPIO_Init(GPIOF, &GPIO_InitStructure);

  //YK8,PG6  YK5,PG7  YK19,PG8,                                       3
  GPIO_InitStructure.GPIO_Pin    = YK8_Pin|YK5_Pin|YK19_Pin;
  GPIO_Init(GPIOG, &GPIO_InitStructure);

  //YK14,PH6  YK11,PH7   YK22,PH8   YK12,PH9   YK16,PH4
  //YK9,PH10  YK21,PH11  YK10,PH12  YK17,PH13  YK2,PH14,              10
  GPIO_InitStructure.GPIO_Pin    = YK14_Pin|YK11_Pin|YK22_Pin|YK12_Pin|YK16_Pin|
    YK19_Pin|YK21_Pin|YK10_Pin|YK17_Pin|YK2_Pin;
  GPIO_Init(GPIOH, &GPIO_InitStructure);
}


/*
*********************************************************************************************************
*
*                                           YK控制
*
* 函数名称 : YK_ON()  YK_OFF()  YK_EN() YK_DIS()
* 函数版本 : V0.01
* 功能描述 : 初始化遥控GPIO
*           :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.08.25
*********************************************************************************************************
*/
void YK_ON(uint32_t yk)
{
  switch(yk)
    {
    case YK1: GPIO_SetBits(YK1_GPIO, YK1_Pin);    break;
    case YK2: GPIO_SetBits(YK2_GPIO, YK2_Pin);    break;
    case YK3: GPIO_SetBits(YK3_GPIO, YK3_Pin);    break;
    case YK4: GPIO_SetBits(YK4_GPIO, YK4_Pin);    break;
    case YK5: GPIO_SetBits(YK5_GPIO, YK5_Pin);    break;
    case YK6: GPIO_SetBits(YK6_GPIO, YK6_Pin);    break;
    case YK7: GPIO_SetBits(YK7_GPIO, YK7_Pin);    break;
    case YK8: GPIO_SetBits(YK8_GPIO, YK8_Pin);    break;
    case YK9: GPIO_SetBits(YK9_GPIO, YK9_Pin);    break;
    case YK10:GPIO_SetBits(YK10_GPIO, YK10_Pin);  break;
    case YK11:GPIO_SetBits(YK11_GPIO, YK11_Pin);  break;
    case YK12:GPIO_SetBits(YK12_GPIO, YK12_Pin);  break;
    case YK13:GPIO_SetBits(YK13_GPIO, YK13_Pin);  break;
    case YK14:GPIO_SetBits(YK14_GPIO, YK14_Pin);  break;
    case YK15:GPIO_SetBits(YK15_GPIO, YK15_Pin);  break;
    case YK16:GPIO_SetBits(YK16_GPIO, YK16_Pin);  break;
    case YK17:GPIO_SetBits(YK17_GPIO, YK17_Pin);  break;
    case YK18:GPIO_SetBits(YK18_GPIO, YK18_Pin);  break;
    case YK19:GPIO_SetBits(YK19_GPIO, YK19_Pin);  break;
    case YK20:GPIO_SetBits(YK20_GPIO, YK20_Pin);  break;
    case YK21:GPIO_SetBits(YK21_GPIO, YK21_Pin);  break;
    case YK22:GPIO_SetBits(YK22_GPIO, YK22_Pin);  break;
    case YK23:GPIO_SetBits(YK23_GPIO, YK23_Pin);  break;
    case YK24:GPIO_SetBits(YK24_GPIO, YK24_Pin);  break;
    default:                                      break;
    }

  YK_EN_ON();
  relayEnCounter |= (1<<yk);

}

void YK_OFF(uint32_t yk)
{
  switch(yk)
    {
    case YK1: GPIO_ResetBits(YK1_GPIO, YK1_Pin);    break;
    case YK2: GPIO_ResetBits(YK2_GPIO, YK2_Pin);    break;
    case YK3: GPIO_ResetBits(YK3_GPIO, YK3_Pin);    break;
    case YK4: GPIO_ResetBits(YK4_GPIO, YK4_Pin);    break;
    case YK5: GPIO_ResetBits(YK5_GPIO, YK5_Pin);    break;
    case YK6: GPIO_ResetBits(YK6_GPIO, YK6_Pin);    break;
    case YK7: GPIO_ResetBits(YK7_GPIO, YK7_Pin);    break;
    case YK8: GPIO_ResetBits(YK8_GPIO, YK8_Pin);    break;
    case YK9: GPIO_ResetBits(YK9_GPIO, YK9_Pin);    break;
    case YK10:GPIO_ResetBits(YK10_GPIO, YK10_Pin);  break;
    case YK11:GPIO_ResetBits(YK11_GPIO, YK11_Pin);  break;
    case YK12:GPIO_ResetBits(YK12_GPIO, YK12_Pin);  break;
    case YK13:GPIO_ResetBits(YK13_GPIO, YK13_Pin);  break;
    case YK14:GPIO_ResetBits(YK14_GPIO, YK14_Pin);  break;
    case YK15:GPIO_ResetBits(YK15_GPIO, YK15_Pin);  break;
    case YK16:GPIO_ResetBits(YK16_GPIO, YK16_Pin);  break;
    case YK17:GPIO_ResetBits(YK17_GPIO, YK17_Pin);  break;
    case YK18:GPIO_ResetBits(YK18_GPIO, YK18_Pin);  break;
    case YK19:GPIO_ResetBits(YK19_GPIO, YK19_Pin);  break;
    case YK20:GPIO_ResetBits(YK20_GPIO, YK20_Pin);  break;
    case YK21:GPIO_ResetBits(YK21_GPIO, YK21_Pin);  break;
    case YK22:GPIO_ResetBits(YK22_GPIO, YK22_Pin);  break;
    case YK23:GPIO_ResetBits(YK23_GPIO, YK23_Pin);  break;
    case YK24:GPIO_ResetBits(YK24_GPIO, YK24_Pin);  break;
    default:                                        break;
    }

  relayEnCounter &= ~(1<<yk);

  if(0 == relayEnCounter) {
      YK_EN_OFF();
    }
}


void YK_EN_ON(void)
{
  GPIO_SetBits(YKCtrl_P_GPIO, YKCtrl_P_Pin);
  GPIO_SetBits(YKCtrl_N_GPIO, YKCtrl_N_Pin);
}

void YK_EN_OFF(void)
{
  GPIO_ResetBits(YKCtrl_P_GPIO, YKCtrl_P_Pin);
  GPIO_ResetBits(YKCtrl_N_GPIO, YKCtrl_N_Pin);
}

/*
*********************************************************************************************************
*
*                                           YK_Auto_RST
*                                      通过定时器自动复归的继电器控制
*
* 函数名称 : YK_Auto_RST()
* 函数版本 : V0.01
* 功能描述 : 转换定时器回调函数的参数，使用TMR指针读取参数具体的数据，在转换为控制信号
*           :
* 编写人员 : HHL
* 修改人员 :
* 编修描述 : V0.01，时间2015.08.25
*********************************************************************************************************
*/
//void YK_Auto_RST(OS_TMR *p_tmr, void *p_arg)
//{
//	CPU_TS  ts;
//	OS_ERR err;
//	OSMutexPend(&YK_Mutex, 0, OS_OPT_PEND_BLOCKING, &ts, &err );
//	OSTaskQPost(&YK_Handle_task_TCB,
//		       (void *)((uint32_t)((OS_TMR *)p_arg)->CallbackPtrArg),
//		       (OS_MSG_SIZE)(0), OS_OPT_POST_FIFO|OS_OPT_POST_NO_SCHED, &err);
//	OSMutexPost(&YK_Mutex, OS_OPT_POST_NO_SCHED, &err);
//}
